package com.streamAPI;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;

/**
 * Stream流的特性
 *    流是lazy的,不用就不会被调用
 *    三大部分:
 *      数据流
 *      N个中间操作
 *      终止操作
 */
public class StreamAPIDemo02 {
    public static void main(String[] args) {
        /**
         * 三大部分:
         * 数据流
         * N个中间操作
         * 终止操作
         */
        //创建数据流
        Stream<Integer> stream = Stream.of(1, 2, 3);

        //一般创建流都是从集合容器中获取流 List Set Map
        //创建集合
        List<Integer> list = List.of(3, 4, 5);
        //在集合中拿到Stream流
        Stream<Integer> listStream = list.stream();

        Set<Integer> set = Set.of(8, 6, 5);
        Stream<Integer> setStream = set.stream();

        Map<Object, Object> map = Map.of();
        map.keySet().stream();
        map.values().stream();

        System.out.println("主线程" + Thread.currentThread());

        //流是并发还是不并发的   不是并发的,底层也是for循环
        //有状态数据将产生安全问题,不要这么写   有状态是指流里面的数据会对流外造成影响
        //流的操作最好是无状态的,流操作的数据都在流内部
        long count = Stream.of(1, 2, 3, 4, 5)
                .parallel()    //调用这个方法就将流变成并发的了   并发以后,要自行解决并发的问题
                .filter(val -> {
                    synchronized (Object.class){   //调用parallel()方法了,就给流加锁
                        System.out.println("filter线程" + Thread.currentThread());
                        System.out.println("正在过滤" + val);
                        return val > 2;
                    }
                })
                .count();//统计一个有几个元素   terminal operation终止操作

        System.out.println("一个有" + count + "元素");

    }
}
